package com.gandong8.es.tool.annotation;

import com.gandong8.es.tool.domain.EsAnalyzer;
import com.gandong8.es.tool.domain.EsConstant;

import java.lang.annotation.*;

/**
 * https://www.elastic.co/guide/en/elasticsearch/reference/master/index.html
 * https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
public @interface EsSetting {
    /**
     * 索引名称
     * 必须小写否则报错：Invalid index name [testIndex], must be lowercase
     */
    String provided_name();

    /**
     * elasticsearch7默认不在支持指定索引类型，默认索引类型是_doc
     */
    String index_type() default "_doc";

    /**
     * 按时间分割索引
     * yyyy-MM-dd： index2020-09-06
     * yyyyMM： index202009
     * _yyyy-MM-dd：index_2020-09-06
     */
    String index_date_format() default "yyyy-MM-dd";
    /**
     * 主分片数量
     * ES默认为一个索引创建5个主分片, 一个副本分片
     * 在集群运行中无法调整分片设置，除非reindex
     * ES推荐的最大JVM堆空间是30~32G, 所以建议单分片最大容量限制为30G
     * 分片数最好不好超过节点数3倍
     */
    int number_of_shards() default EsConstant.number_of_shards;
    /**
     * 备份分片数量:默认1
     * 可动态更改
     */
    int number_of_replicas() default EsConstant.number_of_replicas;

    /**
     * 自定义分词器
     */
    String[] custom_analyzer_name() default {};

    /**
     * 分词器
     */
    EsAnalyzer[] custom_analyzer() default {};

    /**
     * 当数据添加到索引后并不能马上被查询到，等到refresh_interval时间后索引刷新才会被查询到
     * 默认值是 1s,  值为-1时，意味着不刷新索引,但如果缓冲区满的时候也会自动触发refresh操作
     * 可以在已经存在的索引上进行动态更新
     */
    String refresh_interval() default EsConstant.refresh_interval;

    /**
     * request:es默认设置，direct I/O，直接写入到磁盘中，不经过page cache
     * async: buffer I/O，写到page cache，在sync_interval时间以后会把page cache中的内容再写入到磁盘比fsync快，但机器宕机的话，数据会丢失
     * https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html#
     */
    String translog_durability() default "request";

    /**
     * page cache中的数据多久fsync到translog file,默认5s
     */
    String translog_sync_interval() default "5s";

    String translog_flush_threshold_size() default "512mb";

    /**
     * 归并线程的数目:推荐设置为cpu核心数的一半。 机械硬盘读写速度慢如果不是ssd建议降低配置，免得IO瓶颈
     * 如果不配置 ES会启动Math.min(3, Runtime.getRuntime().availableProcessors() / 2) 个线程进行 Merge 操作；
     * 大量的Merge是非常耗cpu的，cpu高伴随会出现大量的bulk rejected
     */
    int merge_scheduler_max_thread_count() default 1;

    /**
     *
     */
    boolean property_snake_case() default true;

}
